package DAL;

import java.io.*;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * Classe  para gerenciar a localização dos Arquivos de Controle do sistema.
 *
 * @author (R Soares)
 * @version (1.0 - 07.04.2010)
 */
public class Conexao
{
    // Variáveis de Instância --------------------------------------------------*
    File _enderecoDados; // _endereco onde se encontram os arquivos de dados de controle.
    File _enderecoImagens; // _endereco onde se encontram os arquivos de imagens.
    private static String connectionUrl, username, password;
    private String [] nome_jogadorRanking;
    private String [] nome_partidaRaking;
    private String [] pontosRanking;
    private String [] nome_partida;
    private String [] nome_jogador;
    private String [] pontos;

    // Construtores ----------------------------------------------------------------*
    /**
     * O construtor da classe localiza a _endereco DadosControle para a utilização de sesu arquivos.
     * Caso a _endereco não seja localizada, será informado erro.
     * 
     * inicializa as String de url, username e password     * 
     */
    
    public Conexao()
    {
        _enderecoDados = obterEnderecoDados("DadosControle");
        _enderecoImagens = obterEnderecoDados("Imagens");

        if(_enderecoDados == null)
        {
            try {
                throw new FileNotFoundException("_endereco não localizado : \\DadosControle");
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if(_enderecoImagens == null)
        {
            try {
                throw new FileNotFoundException("_endereco não localizado : \\Imagens");
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        
        

    }

    // Métodos ------------------------------------------------------------------*

    /**
     * Método que retorna o objeto de um arquivo de controle.
     *
     * @param nome : Nome do arquivo
     * @return  File : Arquivo localizado
     */
    public File obterArquivoControle(String nomeArquivo) throws FileNotFoundException
    {
        File file = new File (_enderecoDados.getPath() + "\\" + nomeArquivo + ".ctr");

        if(!file.exists())
        {
            throw new FileNotFoundException("Arquivo não localizado : \\DadosControle\\" + nomeArquivo + ".ctr");
        }

        return file;
    }

    /**
     * Método que retorna o objeto de um arquivo de imagem.
     *
     * @param nome : Nome do arquivo
     * @return  File : Arquivo localizado
     */
    public File obterArquivoImagem(String nomeArquivo) throws FileNotFoundException
    {
        File file = new File (_enderecoImagens.getPath() + "\\" + nomeArquivo + ".jpg");

        if(!file.exists())
        {
            throw new FileNotFoundException("Arquivo não localizado : \\Imagens\\" + nomeArquivo + ".jpg");
        }

        return file;
    }

    /**
     * get_enderecoDados
     *      Método que retorna um objeto File com o caminho completo (_enderecos e sub_enderecos) da _endereco de
     *      controle do jogo. Caso a _endereco não seja localizada a _endereco retornará null
     *
     * @return  File : Objeto com o endereço da _endereco de dados de controle. Retorna null se a _endereco não
     *                         for localizada.
     */
    private File obterEnderecoDados(String nomePasta)
    {
        // Obtem o nome do arquivo .class de execução (esta classe)
        String myClassFile = getClass().getName().substring(4) + ".class";

        // Obtem a o endereço completo (_enderecos, sub_enderecos e arquivo) onde a classe se encontra
        URL url = getClass().getResource(myClassFile);

        // Cria um objeto File com o endereço da _endereco onde se encontra a classe
        File file = new File(url.getPath()).getParentFile().getParentFile().getParentFile();

        // Cria um objeto File com o endereço dos Arquivos de Dados de Controle
        File _endereco = new File(file.getPath() + "\\" + nomePasta);

        // Verifica se a o endereço é valido e retorna objeto file com o endereço
        if(_endereco.exists())
        {
            return _endereco;
        }

        // Retorna null se o endereço for inválido
        return null;
    }
    
    
    
    //cria a conexao com o banco de dados
    public Connection getConnection() throws ClassNotFoundException, SQLException{
        
        this.connectionUrl = "jdbc:sqlserver://vrenzo\\sqlexpress;databaseName=jogoDatabase";
        this.username = "sa";
        this.password = "senac";      
        
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return DriverManager.getConnection(connectionUrl, username, password);
        
    }
    
    //cria um novo jogador na tabela jogador
    public void inserirJogadorBD(String nome_jogador, String senha){
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();

            stat.execute("insert into jogador(nome_jogador, senha) values ("+nome_jogador+", "+senha+")");
            
            stat.close();
            conn.close();
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
    }
    
    //cria uma partida da tabela partida
    public void inserirPartidaBD(String nome_partida, String jogador, int score_jogador, 
                                 int fase, int ponto, String nivel_partida, int ativo){
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select id_jogador from jogador where nome_jogador = '"+jogador+"'");
            result.next();
            System.out.println(result.getString("id_jogador"));
            stat.execute("insert into partida"
                       + "(nome_partida, id_jogador, score_jogador, fase, ponto, nivel_partida, ativo) "
                       + "values ('"+nome_partida+"', "+result.getString("id_jogador")+", "+score_jogador+", "+fase+", "
                       + ponto+", '"+nivel_partida+"', "+ativo+")");
            result.close();
            stat.close();
            conn.close();
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
    }
    
    //seleciona o ranking na view vw_ranking
    public void ranking(){
        nome_jogadorRanking = new String[10];
        nome_partidaRaking = new String[10];
        pontosRanking = new String[10];
        int i = 0;
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select * from vw_ranking");
            
            while(result.next()){
                nome_jogadorRanking[i] = result.getString("nome_jogador");
                nome_partidaRaking[i] = result.getString("nome_partida");
                pontosRanking[i] = result.getString("ponto");
                i++;
            }
            
            result.close();
            stat.close();
            conn.close();
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
    }
    
    //verifica se o nome do jogador digitado existe
    public boolean existeJogador(String jogador){
        boolean existe = false;
        try{
           
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select nome_jogador from jogador where nome_jogador = '"+jogador+"'");
            
            if(result.next())
                existe = true;
    
            result.close();
            stat.close();
            conn.close();           
            
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
        
        return existe;
    }
    
    //verifica se a senha esta correta
    public boolean senhaCorreta(String senha, String jogador){
        boolean existe = false;
        try{
           
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select senha from jogador where nome_jogador = '"+jogador+"'");
            result.next();
            if(senha.equals(result.getString("senha")))
                existe = true;
    
            result.close();
            stat.close();
            conn.close();           
            
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
        
        return existe;
    }
    
    //retorna dados da partida
    public void retornaDadosPartida(String jogador){
        int i = 0;
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select nome_partida "
                                     + "from Partida left join Jogador "
                                     + "on Partida.id_jogador = Jogador.id_jogador "
                                     + "where nome_jogador = '"+jogador+"' and ativo = 1");
            while(result.next()){
                nome_partida[i] = result.getString("nome_partida");
                i++;
            }
            
            result.close();
            stat.close();
            conn.close();
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
    }
    
    public void desativaPartida(String jogador){
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select id_jogador from jogador where nome_jogador = '"+jogador+"'");
            result.next();
            System.out.println("id"+result.getString("id_jogador"));
            stat.executeUpdate("update partida set "
                             + "ativo = 0"
                             + "where id_jogador = "+result.getString("id_jogador"));
            stat.close();
            conn.close();
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
    }
    
    //altera dados da partida na tabela partida
    public void alteraPartida(String nome_partida, String score_jogador, String fase,
                              String ponto, String nivel_partida, String ativo){
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            
            stat.executeUpdate("update partida set "
                             + "score_jogador = "+score_jogador+"," 
                             + "fase = "+fase+", "
                             + "ponto = "+ponto+", "
                             + "nivel_partida = "+nivel_partida+", "
                             + "ativo = "+ativo+""
                             + "where nome_partida = "+nome_partida);
            stat.close();
            conn.close();
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
    }
    
    public String [] getNomeJogadorRanking(){
        return nome_jogadorRanking;
        
    }
    
    public String [] getNomePartidaRanking(){
        return nome_partidaRaking;
    }
    
    public String [] getPontosRanking(){
        return pontosRanking;
    }
    
    public boolean existePartidaAtiva(String jogador){
        boolean existe = false;
        try{
           
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            result = stat.executeQuery("select ativo, nome_partida "
                                     + "from Partida left join Jogador "
                                     + "on Partida.id_jogador = Jogador.id_jogador "
                                     + "where nome_jogador = '"+jogador+"' and ativo = 1");
            if(result.next())
                existe = true;
            System.out.println();
            result.close();
            stat.close();
            conn.close();           
            
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
        
        return existe;
    }
    
    /*public ArrayList selecionaPartidas(String jogador){
        ArrayList<String> partida = new ArrayList<String>();
        try{
           
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
            ResultSet result;
            
            result = stat.executeQuery("select nome_partidaRaking "
                                     + "from Partida left join Jogador "
                                     + "on Partida.id_jogador = Jogador.id_jogador "
                                     + "where nome_jogadorRanking = '"+jogador+"' and ativo = 1");
            
            while(result.next())
                partida.add(jogador)
            
            result.close();
            stat.close();
            conn.close();           
            
        }
        catch(SQLException ex){System.out.println(ex.getMessage());}
        catch(ClassNotFoundException ex){System.out.println(ex.getMessage());}
        
        return existe;
    }*/
} // FIM CLASSE